package com.lsj.selfloginform.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.password.NoOpPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

@Configuration
public class SecurityConfig  extends WebSecurityConfigurerAdapter {

    @Bean
    public PasswordEncoder passwordEncoder(){
        return NoOpPasswordEncoder.getInstance();
    }

    /*定义用户认证方式*/
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .withUser("lsj")
                .password("123456")
                .roles("admin");
    }

    /*权限配置
    1.配置静态资源放行*/
    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/layui/**");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()//开启认证
                .anyRequest().authenticated()//任何请求都需要进行认证
                .and()
                .formLogin()//开启表单认证
                .loginPage("/login.html")//此处有两个含义
                /*1.定义认证页面名称为login.html，为get方法
                * 2.在没有额外配置请求登录的情况下，/login.html也作为登录请求的action,为post方法*/
                .loginProcessingUrl("/doLogin")//请求登录的url
                .usernameParameter("name")//自定义登录用户的参数名称,默认是username
                .passwordParameter("passwd")//自定义登录密码的参数名称，默认是password
                //登录成功后的服务端跳转的地址(即url不变)，无论登录前请求的是什么url，登录成功后都会调用该请求
                //.successForwardUrl("/success")
                //登录成功后的客户端跳转的地址(即url会改变)，如果登录前有请求的url，就跳转到该url，如果没有，跳转到配置的url中
                .defaultSuccessUrl("/success")
                //重载方法，登录成功后的客户端跳转的地址(即url会改变)，无论登录前请求的是什么url，登录成功后都会调用该请求
                //效果跟successForwardUrl一样
                //.defaultSuccessUrl("/success",true)
//                .failureForwardUrl("/fail")//登录失败之后会发生服务端跳转,且必须是post请求
                .failureUrl("/fail")//在登录失败之后，会发生重定向
//                .failureUrl("/fail")
                .permitAll()//允许任何跟认证相关的请求
                .and()
                .logout()
                .logoutUrl("/logout")//配置注销登录的请求，默认是/logout，get方法
                //.logoutRequestMatcher(new AntPathRequestMatcher("logout","POST"))//修改注销url，而且修改请求方式
                .logoutSuccessUrl("/index")//自定义注销后跳转的地址，默认是跳转回登录地址
                .deleteCookies()//注销后删除cookies
                .invalidateHttpSession(true)//注销后无效session，默认为ture
                .clearAuthentication(true)//注销后清除认证信息，默认为true
                .permitAll()
                .and()
                .csrf().disable();//关闭csrf功能

    }

}
